package cn.lili.modules.store.service;

import cn.lili.common.security.enums.SceneEnums;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.distribution.entity.vos.HomeResult;
import cn.lili.modules.member.entity.dto.CollectionDTO;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.dto.*;
import cn.lili.modules.store.entity.vos.StoreBasicInfoVO;
import cn.lili.modules.store.entity.vos.StoreLicenceVO;
import cn.lili.modules.store.entity.vos.StoreManagementCategoryVO;
import cn.lili.modules.store.entity.vos.StoreVO;
import cn.lili.modules.urbansubstation.entity.vos.UrbanSubstationVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Date;
import java.util.List;

/**
 * 店铺业务层
 *
 * @author pikachu
 * @since 2020/11/18 11:45 上午
 */
public interface StoreService extends IService<Store> {
    /**
     * 增加店铺
     * 用于后台添加店铺
     *
     * @param storeApplyDTO 后台添加店铺信息
     * @return 店铺
     */
    Store add(StoreApplyDTO storeApplyDTO);

    /**
     * 分页条件查询
     * 用于展示店铺列表
     *
     * @return 店铺列表
     */
    Page<StoreVO> findByConditionPage(StoreSearchParams entity, PageVO page);


    /**
     * 列表查询
     *
     * @param searchParams 查询参数
     * @return 店铺列表
     */
    List<Store> list(StoreSearchParams searchParams);


    /**
     * 编辑店铺
     *
     * @param storeEditDTO 店铺修改信息
     * @return 店铺
     */
    Store edit(StoreEditDTO storeEditDTO);

    /**
     * 自定义创建店铺，直接持久化保存DO
     * 用于中台调用，非标准业务流程调用
     *
     * @param store 店铺
     * @return 店铺
     */
    Store customAdd(Store store);


    /**
     * 自定义编辑店铺，持久层修改店铺
     * 用于中台调用，非标准业务流程调用
     *
     * @param store 店铺信息
     * @return 返回店铺信息
     */
    Store customEdit(Store store);


    /**
     * 审核店铺
     *
     * @param id     店铺ID
     * @param passed 审核结果
     */
    void audit(String id, Boolean passed, String rejectReason);

    /**
     * 关闭店铺
     *
     * @param id 店铺ID
     */
    void disable(String id);

    /**
     * 开启店铺
     *
     * @param id 店铺ID
     */
    void enable(String id);

    /**
     * 更新店铺商品数量
     *
     * @param storeId 店铺ID
     * @param num     商品数量
     */
    void updateStoreGoodsNum(String storeId, Long num);

    /**
     * 更新店铺收藏数量
     *
     * @param collectionDTO 收藏信息
     */
    void updateStoreCollectionNum(CollectionDTO collectionDTO);

    /**
     * 更新评分
     *
     * @param storeId          店铺ID
     * @param deliveryScore    物流评分
     * @param serviceScore     服务评分
     * @param descriptionScore 描述评分
     */
    void updateScore(String storeId, String deliveryScore, String serviceScore, String descriptionScore);

    /**
     * 根据店铺ID获取店铺信息VO
     *
     * @param storeId 店铺ID
     * @return 店铺信息VO
     */
    StoreVO getStoreDetailVO(String storeId);

    /**
     * 根据用户ID和场景获取店铺信息VO
     *
     * @param extendId 场景id
     * @param scene    场景
     * @return 店铺信息VO
     */
    Store getStoreDetailBySceneAndUserId(String extendId, SceneEnums scene);

    /**
     * 根据店铺ID获取店铺信息
     *
     * @param managerId 店铺ID
     * @param scene     场景
     * @return 店铺信息
     */
    Store getStoreByManagerId(String managerId, SceneEnums scene);

    /**
     * 修改商家设置
     *
     * @param storeSettingDTO 店铺设置信息
     * @return 店铺详情
     */
    Boolean editStoreSetting(StoreSettingDTO storeSettingDTO);

    /**
     * 获取店铺基本信息
     * 用于前端店铺信息展示
     *
     * @param storeId 店铺ID
     * @return 店铺基本信息
     */
    StoreBasicInfoVO getStoreBasicInfoDTO(String storeId);


    /**
     * 获取店铺经营范围
     *
     * @param storeId 店铺ID
     * @return 店铺经营范围
     */
    List<StoreManagementCategoryVO> goodsManagementCategory(String storeId);

    /**
     * 店铺公司信息
     *
     * @param storeId 店铺ID
     * @return 店铺其他信息
     */
    StoreLicenceVO getStoreLicenceVO(String storeId);

    /**
     * 更新店铺时，同步更新店铺内所有商品信息
     *
     * @param store 店铺信息
     */
    void updateStoreGoodsInfo(Store store);

    /**
     * 店铺所有者信息修改
     *
     * @param storeEditDTO 店铺信息
     */
    void ownerEdit(StoreOwnerEditDTO storeEditDTO);

    /**
     * 根据城市分站获取供应商列表
     *
     * @param urbanId 城市分站ID
     * @return 店铺详情
     */
    List<Store> getSupplierListByUrbanId(String urbanId);

    void auditSupplier(String id, Boolean passed, String rejectReason, String status);

    ResultMessage<List<UrbanSubstationVo>> getUrbanAndStoreList();

    ResultMessage<HomeResult> countingSupplierAdditions();

    public List<Store> getStoreList();
    /**
     * 根据城市分站获取本月新增供应商数量
     * @param urbanId
     * @return
     */
    Long getCurrentMonthSupplierCountByUrbanId(String urbanId);

    /**
     * 根据城市分站获取供应商列表
     *
     * @param urbanId 城市分站ID
     * @return 店铺详情
     */
    Long getSupplierListByParams(String urbanId, Date startTime, Date endTime);
}